package business;

import java.util.ArrayList;
import java.util.List;

import dao.Center;

import business.coding.CenterWeightAndWords;
import business.coding.PosCodeCorp;
import business.coding.SegmentatedCorp;
import business.coding.ParseCodeUtil;
import business.database.BasicQuerys;
import business.database.Database;
import business.database.MaesorgUtils;
import business.iservices.BusinessSrv;

import business.iservices.IPosCodeService;
import result.Result;



/**
 * Servicios para la codificacion de nuevos corps
 * @author 53385255R
 *
 */
public class PosCodeService extends BusinessSrv implements IPosCodeService {


	
	
	/**
	 * @see business.iservices.IPosCodeService#getMaxIdCodeCorp()
	 */
	@Override
	public Result<Integer> getMaxIdCodeCorp() {

		Result<Integer> res = new Result<Integer>("", null,  false);
		
		try {
			int maxIdCodeCorp = BasicQuerys.selectMaxidPreCodeCorp();
			List<Integer> id = new ArrayList<Integer>();
			id.add(maxIdCodeCorp);
			res.set_transfers(id);
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion obteniendo el identificador maximo de la taba CodeCorp.\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}



	/**
	 * @see business.iservices.IPosCodeService#insertPosCodeCorp(business.coding.SegmentatedCorp, business.coding.CenterWeightAndWords, boolean)
	 */
	@Override
	public Result<Object> insertPosCodeCorp(SegmentatedCorp corp, CenterWeightAndWords cen, boolean override) {
	Result<Object> res = new Result<Object>("", null,  false);
		
		try {
			PosCodeCorp posC = new PosCodeCorp();
			res.set_ok(posC.insertPosCodes(corp.get_idcorp(), corp.get_corp(), cen.getCenter(), override));
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion insertando el centro en para corp: " + corp.get_corp() + ".\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}
	
	/**
	 * @see business.iservices.IPosCodeService#insertPosCodeCorp(int, java.lang.String, business.coding.CenterWeightAndWords)
	 */
	@Override
	public Result<Object> insertPosCodeCorp(int idcodecorp, String corp, CenterWeightAndWords cen, boolean override) {
	Result<Object> res = new Result<Object>("", null,  false);
		
		try {
			PosCodeCorp posC = new PosCodeCorp();
			posC.insertPosCodes(idcodecorp, corp, cen.getCenter(), override);
		
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion insertando el centro para corp: " + corp + ".\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}
	

	/**
	 * @see business.iservices.IPosCodeService#ini()
	 */
	@Override
	public Result<Object> ini() {
		Result<Object> res = new Result<Object>("", null,  false);
		
		try {
			PosCodeCorp posC = new PosCodeCorp();
			posC.createPosCodeTable();
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Error al crear la tabla PosCodeCorp en la base de datos. Probablemente ya exista\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}

	/**
	 * @see business.iservices.IPosCodeService#getPosCodeCorpCenters(java.lang.String)
	 */
	@Override
	public Result<CenterWeightAndWords> getPosCodeCorpCenters(String corp) {
		Result<CenterWeightAndWords> res = new Result<CenterWeightAndWords>("", null,  false);
		try {
		PosCodeCorp posC = new PosCodeCorp();
		
		res.set_transfers(posC.getPosCodeCorps(corp));
		res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion obteniendo los centros ya poscodificados del corp " + corp + ".\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}

/**
 * 
 */
	@Override
	public Result<Object> insertManualCodeCorp(SegmentatedCorp _corp,
			CenterWeightAndWords cen) {
		Result<Object> res = new Result<Object>("", null,  false);
		
		try {
			ParseCodeUtil codeUtil = new ParseCodeUtil();
			List<CenterWeightAndWords> cens = new ArrayList<CenterWeightAndWords>();
			cen.set_context(-100.0);
			cens.add(cen);
		
			codeUtil.insertPreCodeCorps(_corp, cens);
			
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion insertando manualmente el centro para el corp: " + _corp.get_corp() + " en la tabla de codificados (CodeCorp).\n" + e.getMessage());
			res.set_ok(false);
		}
		

		return res;
	}

	
	
	/**
	 * Comprueba en el maesorg si el PIOD del centro existe
	 * @param center
	 * @return si el PIOD del centro existe o no
	 */
	@Override
	public Result<Boolean> checkIfCenterExistsInMaesorg(Center center) {
		Result<Boolean> res = new Result<Boolean>("", null,  false);
		try {
		
			List<Boolean> exists = new ArrayList<Boolean>();
			exists.add(MaesorgUtils.centerExists(center));
			res.set_transfers(exists);
		
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion comprobando si el centro  " +  center.getCODE() + " existe en el maesorg\n" + e.getMessage());
			res.set_ok(false);
		}
		
		
		return res;
	}
	
	/**
	 * @see business.iservices.IPosCodeService#countDistinctPosCodedCorps()
	 */
	@Override
	public Result<Integer> countDistinctPosCodedCorps() {

		Result<Integer> res = new Result<Integer>("", null,  false);
		
		try {
			PosCodeCorp posC = new PosCodeCorp();
			List<Integer> id = new ArrayList<Integer>();
			id.add(posC.countDistinctPosCodedCorps());
			res.set_transfers(id);
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion obteniendo el numero de corps codificados hasta el momento.\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}
	
	/**
	 * @see business.iservices.IPosCodeService#countDistinctPreCodedCorps()
	 */
	@Override
	public Result<Integer> countDistinctPreCodedCorps() {

		Result<Integer> res = new Result<Integer>("", null,  false);
		
		try {
			PosCodeCorp posC = new PosCodeCorp();
			List<Integer> id = new ArrayList<Integer>();
			id.add(posC.countDistinctPreCodedCorps());
			res.set_transfers(id);
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion obteniendo el numero total de corps con candidatos.\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}
	
	/**
	 * @see business.iservices.IPosCodeService#countNoCodedCorps()
	 */
	@Override
	public Result<Integer> countNoCodedCorps() {

		Result<Integer> res = new Result<Integer>("", null,  false);
		
		try {
			PosCodeCorp posC = new PosCodeCorp();
			List<Integer> id = new ArrayList<Integer>();
			id.add(posC.countNoCodedCorps());
			res.set_transfers(id);
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion obteniendo el numero de corps sin candidatos.\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}

	/**
	 * @see business.iservices.IPosCodeService#deletePosCodeCorp(business.coding.SegmentatedCorp, business.coding.CenterWeightAndWords)
	 */
	@Override
	public Result<Object> deletePosCodeCorp(SegmentatedCorp corp,
			CenterWeightAndWords cen) {
		Result<Object> res = new Result<Object>("", null,  false);
		
		try {
			PosCodeCorp posC = new PosCodeCorp();
			posC.deletePosCodes(corp.get_corp(), cen.getCenter());
			
		
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion eliminando el centro codificado del corp: " + corp.get_corp() + ".\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
		
	}

	/**
	 * @see business.iservices.IPosCodeService#parseAndCodeSubCorp(java.lang.String)
	 */
	@Override
	public Result<CenterWeightAndWords> parseAndCodeSubCorp(String subcorp) {
		Result<CenterWeightAndWords> res = new Result<CenterWeightAndWords>("", null,  false);
		try {
		ParseCodeUtil parC = new ParseCodeUtil();
		Database.getInstance().startTransaction_Sqlite();
		List<CenterWeightAndWords> l_cen = parC.parseAndCode(subcorp, false);
		//No queremos que se modifique sqlite
		Database.getInstance().rollbackTransaction_Sqlite();
		
		//Los rellenamos con la ayuda de maesorg
		PosCodeCorp posC = new PosCodeCorp();
		for (CenterWeightAndWords cenW : l_cen)
			posC.fillMaesorgHelp(cenW);
		
		res.set_transfers(l_cen);
		res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion obteniendo los centros candidatos del siguiente subcorp " + subcorp + "\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}


	/**
	 * @see business.iservices.IPosCodeService#deletePosCodeCorpCenters(java.lang.String)
	 */
	@Override
	public Result<Object> deletePosCodeCorpCenters(String corp) {
Result<Object> res = new Result<Object>("", null,  false);
		
		try {
			PosCodeCorp posC = new PosCodeCorp();
			posC.deleteAllPosCodes(corp);
			res.set_ok(true);
		} catch (Exception e) {
			ViewLogger.getInstance().error ("Ha saltado una excepcion eliminando los centros codificados del corp: " +  corp + ".\n" + e.getMessage());
			res.set_ok(false);
		}
		
		return res;
	}
	
}
